package com.opengate.base.utils;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 曳戈泰尔
 * @version 1.0
 * @description 获取Ip地址
 * @date 2023/4/26 5:46 PM
 */
public class IpAddressUtil {

    /**
     * 获取Ip地址
     *
     * @param request 请求
     * @return ip地址
     */
    public static String getIpAddress(HttpServletRequest request) {

        // 1. 获取头部“X-Real-IP”并将其存储在变量Xip中。
        String Xip = request.getHeader("X-Real-IP");

        // 2. 获取头部“X-Forwarded-For”并将其存储在变量XFor中。
        String XFor = request.getHeader("X-Forwarded-For");

        // 3. 如果XFor不为空且不等于“unKnown”，则将XFor中的第一个ip地址存储在变量XFor中。
        if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
            // 多次反向代理后会有多个ip值，第一个ip才是真实ip
            int index = XFor.indexOf(",");
            if (index != -1) {
                return XFor.substring(0, index);
            } else {
                return XFor;
            }
        }

        // 4. 如果XFor为空或者等于“unknown”，则将Xip中的值存储在变量XFor中。
        XFor = Xip;
        // 如果XFor为空或者不等于“unknown”，返回XFor中的值。
        if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
            return XFor;
        }

        // 5. 如果XFor为空或者等于“unknown”，则将头部“Proxy-Client-IP”中的值存储在变量XFor中。
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("Proxy-Client-IP");
        }

        // 6. 如果XFor为空或者等于“unknown”，则将头部“WL-Proxy-Client-IP”中的值存储在变量XFor中。
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("WL-Proxy-Client-IP");
        }

        // 7. 如果XFor为空或者等于“unknown”，则将头部“HTTP_CLIENT_IP”中的值存储在变量XFor中。
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("HTTP_CLIENT_IP");
        }

        // 8. 如果XFor为空或者等于“unknown”，则将头部“HTTP_X_FORWARDED_FOR”中的值存储在变量XFor中。
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
        }

        // 9. 如果XFor为空或者等于“unknown”，则将request.getRemoteAddr()中的值存储在变量XFor中。
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getRemoteAddr();
        }

        return XFor;
    }
}
